package com.focus.wecenter.dao;

import com.focus.wecenter.util.PageBean;
import org.hibernate.criterion.DetachedCriteria;

import java.io.Serializable;
import java.util.List;

/**
 * 所有dao接口都要继承该接口，它定义了dao最基本的CRUD功能
 * @author focus
 * @param <T> 该Dao所控制的实体类
 */
public interface BaseDao<T> {

    /**
     * 添加
     * @param t 要插入数据库的实体
     */
	void add(T t);

    /**
     * 更新
     * @param t 更新到数据库中的实体，一般最好是从hibernate中查询出来后再更新回数据库
     */
	void update(T t);

    /**
     * 根据主键ID删除该实体
     * @param id 实体的主键ID，为通用主键为UUID或者自增，用序列化类表示
     */
	void deleteById(Serializable id);

    /**
     * 根据ID查找实体并返回该实体
     * @param id 要查找的实体ID
     * @return 查找到的实体，没有找到返回空
     */
	T findById(Serializable id);

    /**
     * 查询数据库中的所有该实体记录
     * @return 实体的集合
     */
	List<T> findAll();

    /**
     * 使用hibernate的离线查询进行查询，特属于hibernate的概念
     * @param criteria 封装的离线查询对象，包含了要查询的所有条件和实体
     * @return 查询到的实体集合
     */
	List<T> find(DetachedCriteria criteria);

    /**
     * 通过离线查询对象进行分页查询，特属于hibernate使用
     * @param criteria 离线查询条件对象
     * @param currentpage 当前页
     * @param pagesize 查询页的大小
     * @return 封装的分页对象集合，包含了分页要显示的数据
     */
	PageBean<T> findByPage(DetachedCriteria criteria, int currentpage, int pagesize);

}